#!/bin/bash

#Copyright (c) 2020-2021 Huawei Device Co., Ltd.
#Licensed under the Apache License, Version 2.0 (the "License");
#you may not use this file except in compliance with the License.
#You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#Unless required by applicable law or agreed to in writing, software
#distributed under the License is distributed on an "AS IS" BASIS,
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#See the License for the specific language governing permissions and
#limitations under the License.

set -e

product_path=`hb env|grep 'product path:'`
product_path=${product_path:26}
kernel_type=`hb env|grep 'kernel:'`
kernel_type=${kernel_type:20}
board=`hb env|grep 'board:'`
board=${board:19}
product=`hb env|grep 'product:'`
product=${product:21}

real_cmd="${product_path}/qemu_run.sh"
if [[ ! -x "${real_cmd}" ]]; then
    echo -e "Failed: ${real_cmd}"
    echo -e "Using 'hb set' to choose supported QEMU board\n"
    exit
fi
echo -e "board: ${board}\n"

rebuild_image="no"
net_enable="no"
vnc_enable="yes"
add_boot_args="no"
boot_args="no"
gdb_enable="no"
qemu_test="no"
test_file="out/$board/$product/test_result.txt"
elf_file="Invalid"
qemu_help="no"

################### qemu-run options #############################
help_info=$(cat <<-END
Usage: qemu-run [OPTION]...
Run a OHOS image in qemu according to the options.

    Options:

    -e,  --exec file_name           kernel exec file name
    -f,  --force                    rebuild exec file
    -l,  --local-desktop            no VNC
    -b,  --bootargs boot_arguments  additional boot arguments(-bk1=v1,k2=v2...)
    -n,  --net-enable               enable net
    -g,  --gdb                      enable gdb for kernel
    -t,  --test                     test mode, exclusive with -g
    -h,  --help                     print help info
END
)

############################## main ##############################
ARGS=`getopt -o e:b:flngth -l force,net-enable,local-desktop,bootargs:,exec:,gdb,test,help -n "$0" -- "$@"`
if [ $? != 0 ]; then
    echo "Try '$0 --help' for more information."
    exit 1
fi
eval set --"${ARGS}"

while true;do
    case "${1}" in
        -e|--exec)
        elf_file="${2}"
        shift;
        shift;
        ;;
        -f|--force)
        rebuild_image=yes
        shift;
        ;;
        -l|--local-desktop)
        vnc_enable=no
        shift;
        ;;
        -b|--bootargs)
        add_boot_args=yes
        boot_args="${2}"
        shift;
        shift;
        ;;
        -n|--net-enable)
        net_enable=yes
        shift;
        ;;
        -t|--test)
        qemu_test="test"
        shift;
        ;;
        -g|--gdb)
        gdb_enable=yes
        shift;
        echo -e "Qemu kernel gdb enable..."
        ;;
        -h|--help)
        shift;
        qemu_help=yes
        break;
        ;;
        --)
        shift;
        break;
        ;;
    esac
done

if [ "$qemu_test" = "test" ] && [ "$gdb_enable" = "yes" ]; then
  echo "Error: '-g' '-t' options cannot be used together"
  exit 2
fi

############### qemu test #########################
function test_success() {
    echo "Test success!!!"
    exit 0
}

function test_failed() {
    cat $test_file
    echo "Test failed!!!"
    exit 1
}

function start_qemu_test() {
    if [ "$kernel_type" = "liteos_m" ]; then
        if [ ! -f "$test_file" ]; then
            test_failed
        else
            result=`tail -1 $test_file`
            if [ "$result" != "--- Test End ---" ]; then
                test_failed
            fi
            result=`tail -2 $test_file`
            failedresult=${result%,*}
            failed=${failedresult%:*}
            if [ "$failed" != "failed count" ]; then
                test_failed
            fi
            failedcount=${failedresult#*:}
            if [ "$failedcount" = "0" ]; then
                test_success
            else
                test_failed
            fi
       fi
    else
        echo "The kernel does not support the -t/--test option!";
    fi
}

function kill_specified_process(){
    qemu_name=$1
    while true
    do
        pid=`ps -ef | grep $qemu_name | grep -v grep | awk '{print $2}' | head -n 1`
        if [ "$pid" == "" ]; then
            break
        fi
        kill -15 $pid
    done
}

function start_qemu_monitor() {
    if [ "$kernel_type" = "liteos_m" ]; then
        kill_specified_process qemu_mini_test_
        kill_specified_process qemu-system-
        ./vendor/ohemu/common/qemu_mini_test_monitor.sh $test_file &
    fi
}

######### qemu_run.sh parameters ######
# The order of parameters has strict requirements #
qemu_parameters="\
 $elf_file \
 $rebuild_image \
 $vnc_enable \
 $add_boot_args $boot_args \
 $net_enable \
 $gdb_enable \
 $qemu_test $test_file \
 $qemu_help"

function start_qemu() {
    set +e
    if [ $qemu_help = no ]; then
        read -t 5 -p "Enter to start qemu[y/n]:" flag
        set -e
        start=${flag:-y}
    fi
    if [ $qemu_help = yes ] || [ ${start} = y ]; then
        if [ "$qemu_test" = "test" ]; then
            start_qemu_monitor
        fi

        $real_cmd $qemu_parameters

        if [ "$qemu_test" = "test" ]; then
            start_qemu_test
        fi
    else
        echo "Exit qemu-run"
    fi
}

start_qemu
